﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Tesis2.Models;

namespace Tesis2.Controllers
{
    public class AlmacenController : Controller
    {
        private TesisDBContext db = new TesisDBContext();

        //
        // GET: /Almacen/

        public ActionResult Index()
        {
            var almacenes = db.Almacenes.Include(a => a.EstadoAlmacen).Include(a => a.InstitucionAlmacen).Include(a => a.DireccionAlmacen).ToList();
            return View(almacenes);
        }

        public ActionResult List(string Codigo, string Nombre)
        {
            int id =  Convert.ToInt32(Codigo);
            
            var almacenes = (from item in db.Almacenes
                             where item.AlmacenID.Equals(id) || item.Nombre.Contains(Nombre)
                             select item).ToList();

            foreach (var alm in almacenes)
            {
                Institucion i = db.Instituciones.Find(alm.InstitucionAlmacenID);
                alm.InstitucionAlmacen = i;
            }

            return View(almacenes);
        }

        public ActionResult Search()
        {
            var almacenes = db.Almacenes.Include(a => a.EstadoAlmacen).Include(a => a.InstitucionAlmacen).Include(a => a.DireccionAlmacen).ToList();

            foreach (var alm in almacenes)
            {
                Institucion i = db.Instituciones.Find(alm.InstitucionAlmacenID);
                alm.InstitucionAlmacen = i;
            }
            return View(almacenes);
        }

        //
        // GET: /Almacen/Details/5

        public ActionResult Details(int id = 0)
        {
            Almacen almacen = db.Almacenes.Find(id);
            if (almacen == null)
            {
                return HttpNotFound();
            }
            return View(almacen);
        }

        //
        // GET: /Almacen/Create

        public ActionResult Create()
        {
            ViewBag.EstadoAlmacenID = new SelectList((from item in db.Parametros
                                                      where item.CodigoUnico.Equals("ESTADOALMACEN")
                                                      select item), "ParametroID", "Valor").ToList();
            ViewBag.InstitucionAlmacenID = new SelectList(db.Instituciones, "InstitucionID", "Nombre");
            ViewBag.DireccionAlmacenID = new SelectList(db.Direcciones, "DireccionID", "Descripcion");
            ViewBag.Departamento = new SelectList((from item in db.Parametros
                                                   where item.CodigoUnico.Equals("DEPARTAMENTO")
                                                   select item.Valor)).ToList();
            ViewBag.Provincia = new SelectList((from item in db.Parametros
                                                where item.CodigoUnico.Equals("PROVINCIA")
                                                select item.Valor)).ToList();
            ViewBag.Distrito = new SelectList((from item in db.Parametros
                                               where item.CodigoUnico.Equals("DISTRITO")
                                               select item.Valor)).ToList();
            return View();
        }

        //
        // POST: /Almacen/Create

        [HttpPost]
        public ActionResult Create(Almacen almacen, string Departamento, string Provincia, string Distrito)
        {
            if (ModelState.IsValid)
            {
                Direccion d = new Direccion();
                d.Descripcion = almacen.DireccionAlmacen.Descripcion;
                var depto = from item in db.Parametros
                            where item.CodigoUnico.Equals("DEPARTAMENTO") && item.Valor.Equals(Departamento)
                            select item;
                var prov = from item in db.Parametros
                            where item.CodigoUnico.Equals("PROVINCIA") && item.Valor.Equals(Provincia)
                            select item;
                var dist = from item in db.Parametros
                            where item.CodigoUnico.Equals("DISTRITO") && item.Valor.Equals(Distrito)
                            select item;
                d.Departamento = (Parametro)depto.FirstOrDefault();
                d.DepartamentoID = ((Parametro)depto.FirstOrDefault()).ParametroID;
                d.Provincia = (Parametro)prov.FirstOrDefault();
                d.ProvinciaID = ((Parametro)prov.FirstOrDefault()).ParametroID;
                d.Distrito = (Parametro)dist.FirstOrDefault();
                d.DistritoID = ((Parametro)dist.FirstOrDefault()).ParametroID;

                db.Direcciones.Add(d);
                db.SaveChanges();

                almacen.DireccionAlmacenID = d.DireccionID;
                almacen.DireccionAlmacen = d;
                //db.Direcciones.Add(d);
                db.Almacenes.Add(almacen);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            ViewBag.EstadoAlmacenID = new SelectList((from item in db.Parametros
                                                      where item.CodigoUnico.Equals("ESTADOALMACEN")
                                                      select item),"ParametroID", "Valor").ToList();
            ViewBag.InstitucionAlmacenID = new SelectList(db.Instituciones, "InstitucionID", "Nombre");
            ViewBag.DireccionAlmacenID = new SelectList(db.Direcciones, "DireccionID", "Descripcion");
            ViewBag.Departamento = new SelectList((from item in db.Parametros
                                                   where item.CodigoUnico.Equals("DEPARTAMENTO")
                                                   select item.Valor)).ToList();
            ViewBag.Provincia = new SelectList((from item in db.Parametros
                                                where item.CodigoUnico.Equals("PROVINCIA")
                                                select item.Valor)).ToList();
            ViewBag.Distrito = new SelectList((from item in db.Parametros
                                               where item.CodigoUnico.Equals("DISTRITO")
                                               select item.Valor)).ToList();
            return View(almacen);
        }

        //
        // GET: /Almacen/Edit/5

        public ActionResult Edit(int id = 0)
        {
            Almacen almacen = db.Almacenes.Find(id);
            if (almacen == null)
            {
                return HttpNotFound();
            }
            

            Parametro estado = db.Parametros.Find(almacen.EstadoAlmacenID);
            Institucion inst = db.Instituciones.Find(almacen.InstitucionAlmacenID);
            Direccion d = db.Direcciones.Find(almacen.DireccionAlmacenID);
            Parametro depto = db.Parametros.Find(d.DepartamentoID);
            Parametro prov = db.Parametros.Find(d.ProvinciaID);
            Parametro dist = db.Parametros.Find(d.DistritoID);

            Session["Direccion"] = d;

            ViewBag.EstadoAlmacenID = new SelectList((from item in db.Parametros
                                                      where item.CodigoUnico.Equals("ESTADOALMACEN")
                                                      select item), "ParametroID", "Valor", estado.Valor).ToList();
            ViewBag.InstitucionAlmacenID = new SelectList(db.Instituciones, "InstitucionID", "Nombre", inst.Nombre);
            ViewBag.DireccionAlmacenID = new SelectList(db.Direcciones, "DireccionID", "Descripcion", d.Descripcion);
            ViewBag.Departamento = new SelectList((from item in db.Parametros
                                                   where item.CodigoUnico.Equals("DEPARTAMENTO")
                                                   select item.Valor), depto.Valor).ToList();
            ViewBag.Provincia = new SelectList((from item in db.Parametros
                                                where item.CodigoUnico.Equals("PROVINCIA")
                                                select item.Valor), prov.Valor).ToList();
            ViewBag.Distrito = new SelectList((from item in db.Parametros
                                               where item.CodigoUnico.Equals("DISTRITO")
                                               select item.Valor), dist.Valor).ToList();
            return View(almacen);
        }

        //
        // POST: /Almacen/Edit/5

        [HttpPost]
        public ActionResult Edit(Almacen almacen, string Departamento, string Provincia, string Distrito)
        {
            if (ModelState.IsValid)
            {
                Direccion d = (Direccion)Session["Direccion"];

                d.Descripcion = almacen.DireccionAlmacen.Descripcion;
                var depto = from item in db.Parametros
                            where item.CodigoUnico.Equals("DEPARTAMENTO") && item.Valor.Equals(Departamento)
                            select item;
                var prov = from item in db.Parametros
                           where item.CodigoUnico.Equals("PROVINCIA") && item.Valor.Equals(Provincia)
                           select item;
                var dist = from item in db.Parametros
                           where item.CodigoUnico.Equals("DISTRITO") && item.Valor.Equals(Distrito)
                           select item;
                d.Departamento = (Parametro)depto.FirstOrDefault();
                d.DepartamentoID = ((Parametro)depto.FirstOrDefault()).ParametroID;
                d.Provincia = (Parametro)prov.FirstOrDefault();
                d.ProvinciaID = ((Parametro)prov.FirstOrDefault()).ParametroID;
                d.Distrito = (Parametro)dist.FirstOrDefault();
                d.DistritoID = ((Parametro)dist.FirstOrDefault()).ParametroID;

                almacen.DireccionAlmacen = d;

                db.Entry(d).State = EntityState.Modified;
                db.Entry(almacen).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            Session["Direccion"] = almacen.DireccionAlmacen;
            ViewBag.EstadoAlmacenID = new SelectList((from item in db.Parametros
                                                      where item.CodigoUnico.Equals("ESTADOALMACEN")
                                                      select item), "ParametroID", "Valor", almacen.EstadoAlmacen.Valor).ToList();
            ViewBag.InstitucionAlmacenID = new SelectList(db.Instituciones, "InstitucionID", "Nombre", almacen.InstitucionAlmacen.Nombre);
            ViewBag.DireccionAlmacenID = new SelectList(db.Direcciones, "DireccionID", "Descripcion", almacen.DireccionAlmacen.Descripcion);
            ViewBag.Departamento = new SelectList((from item in db.Parametros
                                                   where item.CodigoUnico.Equals("DEPARTAMENTO")
                                                   select item.Valor), almacen.DireccionAlmacen.Departamento.Valor).ToList();
            ViewBag.Provincia = new SelectList((from item in db.Parametros
                                                where item.CodigoUnico.Equals("PROVINCIA")
                                                select item.Valor), almacen.DireccionAlmacen.Provincia.Valor).ToList();
            ViewBag.Distrito = new SelectList((from item in db.Parametros
                                               where item.CodigoUnico.Equals("DISTRITO")
                                               select item.Valor), almacen.DireccionAlmacen.Distrito.Valor).ToList();
            return View(almacen);
        }

        //
        // GET: /Almacen/Delete/5

        public ActionResult Delete(int id = 0)
        {
            Almacen almacen = db.Almacenes.Find(id);
            if (almacen == null)
            {
                return HttpNotFound();
            }
            return View(almacen);
        }

        //
        // POST: /Almacen/Delete/5

        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {
            Almacen almacen = db.Almacenes.Find(id);
            db.Almacenes.Remove(almacen);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            if (db != null)
            {
                db.Dispose();
                base.Dispose(disposing);
            }
        }

        public ActionResult Config()
        {
            ViewBag.Estado = (from item in db.Parametros
                              where item.CodigoUnico.Equals("ESTADOALMACEN")
                              select item).ToList();
            return View();
        }


        public ActionResult Report()
        {
            var almacenes = db.Almacenes.Include(a => a.EstadoAlmacen).Include(a => a.InstitucionAlmacen).Include(a => a.DireccionAlmacen);
            return View(almacenes.ToList());
        }

        
        public ActionResult Inventarios()
        {
            var almacenes = db.Almacenes.Include(a => a.EstadoAlmacen).Include(a => a.InstitucionAlmacen).Include(a => a.DireccionAlmacen).ToList();
            var productos = db.Productos.Include(p => p.UnidadProducto).ToList();

            List<object> lista = new List<object>();

            var data = new object();

            foreach (var alm in almacenes)
            {
                var inventarioproducto = (from item in db.ProductoXAlmacenes
                                          where item.AlmacenProductoID == alm.AlmacenID
                                          select item).ToList();

                foreach (var p in inventarioproducto)
                {
                    Producto prod = db.Productos.Find(p.ProductoAlmacenID);
                               
                    lista.Add(new { Name = prod.Nombre, House = alm.Nombre, Value = p.Stock});
                }

            }

            ViewBag.Lista = lista;

            return View(almacenes.ToList());
        }

        public JsonResult GetDataInventario()
        {
            var almacenes = db.Almacenes.Include(a => a.EstadoAlmacen).Include(a => a.InstitucionAlmacen).Include(a => a.DireccionAlmacen).ToList();
            var productos = db.Productos.Include(p => p.UnidadProducto).ToList();
            int cantidad = 0;
            List<object> lista = new List<object>();

            var data = new object();

            foreach (var prod in productos)
            {
                var inventarioproducto = (from item in db.ProductoXAlmacenes
                                         where item.ProductoAlmacenID == prod.ProductoID
                                         select item).ToList();

                foreach (var p in inventarioproducto)
                {
                    cantidad += p.Stock;
                }

                lista.Add(new {Name = prod.Nombre, Value = cantidad});

                cantidad = 0;
            }



            return Json(lista);
        }

        public JsonResult GetDataSolicitud()
        {
            
            Parametro atendida = (from item in db.Parametros
                               where item.CodigoUnico.Equals("ESTADOSOLICITUD") && item.Valor.Equals("Atendida")
                               select item).FirstOrDefault();

            Parametro aprobada = (from item in db.Parametros
                               where item.CodigoUnico.Equals("ESTADOSOLICITUD") && item.Valor.Equals("Aprobado")
                               select item).FirstOrDefault();

            Parametro desaprobada = (from item in db.Parametros
                                    where item.CodigoUnico.Equals("ESTADOSOLICITUD") && item.Valor.Equals("Desaprobado")
                                    select item).FirstOrDefault();

            Parametro enviada = (from item in db.Parametros
                               where item.CodigoUnico.Equals("ESTADOSOLICITUD") && item.Valor.Equals("Enviada")
                               select item).FirstOrDefault();
            
            int solicitudesAtendida = (from item in db.Solicitudes
                                where item.EstadoSolicitudID.Equals(atendida.ParametroID)
                                select item).ToList().Count;

            int solicitudesAprobada = (from item in db.Solicitudes
                                       where item.EstadoSolicitudID.Equals(aprobada.ParametroID)
                                       select item).ToList().Count;

            int solicitudesDesaprobada = (from item in db.Solicitudes
                                       where item.EstadoSolicitudID.Equals(desaprobada.ParametroID)
                                       select item).ToList().Count;

            int solicitudesEnviada = (from item in db.Solicitudes
                                       where item.EstadoSolicitudID.Equals(enviada.ParametroID)
                                       select item).ToList().Count;

            List<object> lista = new List<object>();

            lista.Add(new { Name = "Atendida", Value = solicitudesAtendida });
            lista.Add(new { Name = "Enviada", Value = solicitudesEnviada });
            lista.Add(new { Name = "Aprobada", Value = solicitudesAprobada });
            lista.Add(new { Name = "Desaprobada", Value = solicitudesDesaprobada });

            return Json(lista);
        }

        public ActionResult Movimientos()
        {
            var solicitudes = db.Solicitudes.Include(s => s.EstadoSolicitud).Include(s => s.UsuarioSolicitud);
            return View(solicitudes.ToList());
        }

        public ActionResult Check()
        {
            var solicitudes = db.Solicitudes.Include(s => s.EstadoSolicitud).Include(s => s.UsuarioSolicitud);
            return View(solicitudes.ToList());
        }
    }
}